# 网易云音乐下载器

# import requests
# url='https://music.163.com/#/search/m/?s=%E8%BF%9D%E7%AB%A0%E5%8A%A8%E7%89%A9&type=1'
# res = requests.get(url)静态页面爬取
from selenium import webdriver
import os
# 保存网页内容到文件
from urllib.request import urlretrieve
from tkinter import *

# 爬取音乐(动态页面)

# 搜索函数
def get_music_name():

    # 获取歌曲名称
    name=entry.get()
    url='https://music.163.com/#/search/m/?s={}&type=1'.format(name)

    # 隐藏浏览器
    option=webdriver.FirefoxOptions()
    option.add_argument('--headless')
    driver=webdriver.Firefox(firefox_options=option)

    # 搜索歌曲页面
    # driver = webdriver.Firefox()
    driver.get(url)

    # 根据id查询到标签
    driver.switch_to.frame('g_iframe')

    # 获取歌曲id
    res = driver.find_element_by_id('m-search')
    music_url = res.find_element_by_xpath('.//div[@class="item f-cb h-flag  "]/div[2]//a').get_attribute("href")
    print(music_url)

    # 提取id
    music_id = music_url.split('=')[-1]
    # print(music_id)

    # 提取歌名
    music_name=res.find_element_by_xpath('.//div[@class="item f-cb h-flag  "]/div[2]//b').get_attribute("title")
    # print(music_name)

    # 构造字典保存歌曲信息用于下载
    item={}
    item['music_id']=music_id
    item['music_name']=music_name

    # 退出浏览器
    driver.quit()

    # 下载歌曲
    music_load(item)

def music_load(item):
    music_id=item['music_id']
    music_name=item['music_name']

    # id填充到下载url中
    music_download_url='https://music.163.com/song/media/outer/url?id={}.mp3'.format(music_id)

    # 创建保存文件夹,ok参数:如果已存在同名文件夹,不会再创建,也不会报错
    os.makedirs('music_netease',exist_ok=True)
    path='music_netease\{}.mp3'.format(music_name)

    # 显示数据到文本框
    text.insert(END,'歌曲:{},正在下载...'.format(music_name))
    # 文本滚动
    text.see(END)
    # 更新
    text.update()

    # 下载
    urlretrieve(music_download_url,path)

    # 下载完成,显示完成
    text.insert(END,'下载完毕:{},请试听!'.format(music_name))
    text.see(END)
    text.update()

# 搭建界面
# 创建界面 画板
root = Tk()
# 标题
root.title('网易云音乐下载')
# 设置窗口大小+窗口出现位置
root.geometry('560x450+400+200')

# 标签控件
label = Label(root,text='请输入下载的歌曲：',font=('华文行楷',20))

# 标签定位
label.grid()
# 输入框
entry = Entry(root,font=('隶书',20))
# 定位
entry.grid(row=0,column=1)
# 列表框
text = Listbox(root,font=('楷书',16),width=50,height=15)
# 定位 columnspan组件横跨的列数
text.grid(row=1,columnspan=2)



# 点击下载按钮command命令响应
btn_download=Button(root,text='开始下载',font=('楷书',16),command=get_music_name)
# 定位,在西侧即左边
btn_download.grid(row=2,column=0,sticky=W)
# 点击退出按钮
btn_quit=Button(root,text='退出程序',font=('楷书',16),command=root.quit)
# 定位,在西侧即左边
btn_quit.grid(row=2,column=1,sticky=E)

# 显示界面
root.mainloop()
# pyinstaller -i 添加图标
#             -w 去除命令行
#             -f +文件路径